格雷码
题目 格雷码
思路分析
奇数次时 改变末尾数字
偶数次时 找到最右边一个1 改变其左侧数字
显然这是要补充第二种情况的实现逻辑
找到最右边的一个1 lowbit x&-x即可 要把左边那个数改变 应该是生成一个 形如00100的掩码 1的位置应该是lowbit找到的1的位置的左边 即 (x&-x)<<1
a = a^((a&-a )<<1)
代码实现
#include <stdio.h>
void show(int a,int n)
{
int i;
int msk = 1;
for(i=0; i<n-1; i++) msk = msk << 1;
for(i=0; i<n; i++){
printf((a & msk)? "1" : "0");
msk = msk >> 1;
}
printf("\n");
}
void f(int n)
{
int i;
int num = 1;
for(i=0; i<n; i++) num = num<<1;
int a = 0;
for(i=0; i<num; i++){
show(a,n);
if(i%2==0){
a = a ^ 1;
}
else{
a = a^((a&-a)<<1); //填空
}
}
}
int main()
{
int a;
scanf("%d",&a);
f(a);
return 0;
}
💬 评论